/**
 * 用户认证和状态管理工具
 * 用于管理用户登录状态、token 和用户信息
 */

// 存储键名常量
const STORAGE_KEYS = {
  TOKEN: 'token',
  USER_ID: 'userId',
  PHONE: 'phone',
  EXPIRES_IN: 'expiresIn',
  IS_NEW_USER: 'isNewUser',
  USER_INFO: 'userInfo'
}

/**
 * 用户认证管理类
 */
class AuthManager {
  constructor() {
    this.isLogin = false
    this.userInfo = null
    this.token = null
    this.init()
  }

  /**
   * 初始化认证状态
   */
  init() {
    try {
      // 从本地存储中恢复用户信息
      this.token = uni.getStorageSync(STORAGE_KEYS.TOKEN)
      this.userInfo = uni.getStorageSync(STORAGE_KEYS.USER_INFO)
      
      if (this.token && this.userInfo) {
        // 检查 token 是否过期
        if (this.isTokenValid()) {
          this.isLogin = true
          console.log('用户已登录:', this.userInfo)
        } else {
          console.log('Token 已过期，清除用户信息')
          this.logout()
        }
      }
    } catch (error) {
      console.error('初始化认证状态失败:', error)
      this.logout()
    }
  }

  /**
   * 检查 token 是否有效
   */
  isTokenValid() {
    if (!this.token || !this.userInfo) {
      console.log('Token验证失败: 缺少token或用户信息')
      return false
    }

    // 检查过期时间
    const expiresIn = this.userInfo.expiresIn
    if (expiresIn && expiresIn > 0) {
      const now = Date.now()
      // 修复：expiresIn是秒数，需要转换为毫秒并加到当前时间
      const tokenExpireTime = now + (expiresIn * 1000)
      const isValid = now < tokenExpireTime
      console.log('Token过期时间检查:', {
        now: new Date(now).toLocaleString(),
        tokenExpireTime: new Date(tokenExpireTime).toLocaleString(),
        expiresIn: expiresIn,
        expiresInSeconds: expiresIn,
        expiresInMinutes: Math.round(expiresIn / 60),
        isValid: isValid
      })
      return isValid
    }

    // 如果没有设置过期时间，或者expiresIn为0，则认为token有效
    console.log('Token验证通过: 未设置过期时间或expiresIn为0')
    return true
  }

  /**
   * 保存用户信息
   * @param {Object} userData 用户数据
   */
  saveUserInfo(userData) {
    try {
      console.log('保存用户信息:', userData)
      
      // 验证必要字段
      if (!userData || !userData.token) {
        throw new Error('用户数据不完整')
      }

      // 构建用户信息对象
      // 如果expiresIn太小（小于1小时），设置一个合理的默认值（24小时）
      let expiresIn = userData.expiresIn || 0
      if (expiresIn > 0 && expiresIn < 3600) {
        console.log(`expiresIn值过小(${expiresIn}秒)，设置为默认值24小时`)
        expiresIn = 24 * 60 * 60 // 24小时
      }
      
      const userInfo = {
        userId: userData.userId || null,
        phone: userData.phone || '',
        token: userData.token,
        expiresIn: expiresIn,
        isNewUser: userData.isNewUser || false,
        loginTime: Date.now()
      }

      // 保存到本地存储
      uni.setStorageSync(STORAGE_KEYS.TOKEN, userData.token)
      uni.setStorageSync(STORAGE_KEYS.USER_INFO, userInfo)
      uni.setStorageSync(STORAGE_KEYS.USER_ID, userInfo.userId)
      uni.setStorageSync(STORAGE_KEYS.PHONE, userInfo.phone)
      uni.setStorageSync(STORAGE_KEYS.EXPIRES_IN, userInfo.expiresIn)
      uni.setStorageSync(STORAGE_KEYS.IS_NEW_USER, userInfo.isNewUser)

      // 更新内存中的状态
      this.token = userData.token
      this.userInfo = userInfo
      this.isLogin = true

      console.log('用户信息保存成功')
      return true
    } catch (error) {
      console.error('保存用户信息失败:', error)
      throw error
    }
  }

  /**
   * 获取用户信息
   */
  getUserInfo() {
    return this.userInfo
  }

  /**
   * 获取 token
   */
  getToken() {
    return this.token
  }

  /**
   * 检查是否已登录
   */
  checkLogin() {
    return this.isLogin && this.isTokenValid()
  }

  /**
   * 登出
   */
  logout() {
    try {
      // 清除本地存储
      uni.removeStorageSync(STORAGE_KEYS.TOKEN)
      uni.removeStorageSync(STORAGE_KEYS.USER_INFO)
      uni.removeStorageSync(STORAGE_KEYS.USER_ID)
      uni.removeStorageSync(STORAGE_KEYS.PHONE)
      uni.removeStorageSync(STORAGE_KEYS.EXPIRES_IN)
      uni.removeStorageSync(STORAGE_KEYS.IS_NEW_USER)

      // 清除内存中的状态
      this.isLogin = false
      this.userInfo = null
      this.token = null

      console.log('用户已登出')
    } catch (error) {
      console.error('登出失败:', error)
    }
  }

  /**
   * 获取请求头（包含 token）
   */
  getAuthHeaders() {
    if (this.checkLogin()) {
      return {
        'Authorization': `Bearer ${this.token}`,
        'Content-Type': 'application/json',
        'token': this.token,  // 添加token字段，若依框架可能需要
        'X-Token': this.token  // 添加X-Token字段，另一种常见格式
      }
    }
    return {
      'Content-Type': 'application/json'
    }
  }

  /**
   * 刷新 token（如果需要的话）
   */
  async refreshToken() {
    // 这里可以实现 token 刷新逻辑
    // 暂时返回当前 token
    return this.token
  }
}

// 创建全局实例
const authManager = new AuthManager()

// 导出实例和类
export default authManager
export { AuthManager, STORAGE_KEYS }
